function generate(ast){
   /**  入参
    * {
    *   tag:'div',
    *   attrs:{id:'app',class:'box'},
    *   children:[]
    * }
    */
  //最后结果  _c('div',{id:'app',a:1},_c('span',{属性},'world'),_v(文本))
  //_c(标签名，属性，子节点)
  let children=genChildren(ast)
  let str=`_c('${ast.tag}',${
     ast.attrs.length>0?genProps(ast.attrs):undefined
  }${
      children?`,${children}`:''
  })`
   return str
}

function genChildren(ast){
    /**
     * children:[{标签},{文本},{}]
     */
    //处理子节点
    if(ast.children&&ast.children.length>0){
      return   ast.children.map(item=>{
          //将子节点里的标签或文本最后拼成字符串后用逗号链接
          return gen(item)  
      })
    }

    return false
}
const defaultTagRE = /\{\{((?:.|\r?\n)+?)\}\}/g // {{aaaaa}}
function gen(node){
  //处理单个节点的属性和文本
  if(node.type===1){
      //标签节点 接续递归
     return generate(node)
  }else{
      //文本节点
      let text=node.text
      if(defaultTagRE.test(text)){
          //变量文本  hello {{arr}} {{aa}} world
          let token=[]
          let match=''
          let lastIndex=defaultTagRE.lastIndex=0  //每次匹配到所停留的位置
          while (match=defaultTagRE.exec(text)) {
              console.log(match,'匹配到的变量文本')
              let index=match.index
              if(index>lastIndex){
                  //将普通文本加入到token中
                  token.push(JSON.stringify(text.slice(lastIndex,index)))
              }
              //收集变量文本
              token.push(`_s(${match[1].trim()})`)
              lastIndex=index+match[0].length
          }
          if(lastIndex<text.length){
              //收集末尾的文本
              token.push(JSON.stringify(text.slice(lastIndex)))
          }
          console.log(token,'收集的文本')
          return  `_v(${token.join('+')})`   
      }else{
          //普通文本
          return `_v(${JSON.stringify(text) })`
      }
  }
}
function genProps(attrs){
   //处理标签属性 // [{name:'xxx',value:'xxx'},{name:'xxx',value:'xxx'}]
   //处理结果  {id:'app',a:1}
   let str=''
   for(let item of attrs){
       if(item.name==='style'){
          //name:style,value:color:red;background:blue
          let styleObj={}
          item.value.replace(/([^;:]+)\:([^;:]+)/g,function(){
              styleObj[arguments[1]]=arguments[2]
          })
          item.value=styleObj
       }
       str+=`${item.name}:${JSON.stringify(item.value)},`
   }
   return `{${str.slice(0,-1)}}`  //把最后一个逗号去掉
}

export default generate